#include <uapi/linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/sched.h>
#include "bpf_legacy.h"

struct procInfo{
	u32  pid;
	u32  tgid;
	u32  uid;
	u32  gid;
	char name[100];
};

struct {
	__uint(type, BPF_MAP_TYPE_ARRAY);
	__uint(key_size, sizeof(u32));
	__uint(value_size, sizeof(struct procInfo));
	__uint(max_entries, 500);
} my_map SEC(".maps");			//创建一个bpf map



SEC("kprobe/schedule")  以下bpf程序通过kprobe技术插入到进程调度器里    
int bpf_prog(struct pt_regs *ctx)
{

	u32 index = 123;		//使用的键值，  123，       *bpf程序往map里面的123键值对应的内存写数据
	u64 pid = 0, tgid = 0;
	const u32 * uuuuid;
	struct task_struct *task = NULL;
	struct procInfo    *proc =  NULL;

	task = (struct task_struct *)bpf_get_current_task();  //获取进程的task_struct
	proc = bpf_map_lookup_elem(&my_map, &index);		//通过index（123） 查找bpf map，  得到对应内存
	
	if (proc){
		proc->pid = bpf_get_current_pid_tgid() >> 32;  //Get pid		//bpf_get_current_pid_tgid() 获取到一个64位无符号数，   高32位等于tpid（进程pid） 位移运算>>32 得到高32位
		proc->tgid = bpf_get_current_pid_tgid()&0x0000FFFF; // Get lower 32 bits		//获取低32位的tgid（进程组id）
		proc->uid = bpf_get_current_uid_gid() >> 32;		//bpf_get_current_uid_gid() 获取到一个64位无符号数，   高32位等于tgid（用户组id） 位移运算>>32  得到高32位	
		proc->gid = bpf_get_current_uid_gid() & 0x0000FFFF;	//获取低32位的tgid（用户组id）
		bpf_get_current_comm(proc->name, 99);				//获取进程名写入bpf map
	}			
		
	return 0;
}
char _license[] SEC("license") = "GPL";			//将_license设为项目的许可证   内核会使用许可证区段验证该程序是否与内核的许可证兼容，目前所有注入内核的 BPF 程序都需要附带 GPL 协议支持信息

